// never类型
// 只有抛出错误，才是 never 类型
function fail(msg: string): never {
  throw new Error(msg)
}

// 无限执行的函数
function fail02(): never {
  while (true) {
    console.log('sing...')
  }
}

// 从集合论的角度看，number|never等同于number
// 这也提示我们，函数的返回值无论是什么类型，都可能包含了抛出错误的情况
function sometimesThrow(): number {
  if (Math.random() > 0.5) {
    return 100
  }

  throw new Error('something went wrong')
}

const result = sometimesThrow()

// 局部类型
function hello(txt: string) {
  type message = string
  let newTxt: message = 'hello' + txt
  return newTxt
}

// const newTxt: message = hello('message') // 找不到名称“message”

// 高阶函数
;(someValue: number) => (multiplier: number) => someValue * multiplier

// 函数重载
reverse('abc')
reverse([1, 2, 3])

// 函数声明
function reverse(str: string): string
function reverse(arr: number[]): number[]

// 函数实现
function reverse(stringOrArray: string | number[]) {
  if (typeof stringOrArray === 'string') {
    return stringOrArray.split('').reverse().join('')
  } else {
    return stringOrArray.reverse()
  }
}

// 构造函数
class Animal {
  numLegs: number = 4
}

type AnimalConstructor = new () => Animal

function create(c: AnimalConstructor) {
  return new c()
}

const a = create(Animal)

type F = {
  new (s: string): object
  (n?: number): number
}

